Add more in_irq() checking. Add irq_enter()/irq_exit() where
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 5 May 2006 14:15:56 +0000 (15:15 +0100)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 5 May 2006 14:15:56 +0000 (15:15 +0100)
they are missing in a few places.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain.c
xen/arch/x86/smp.c
xen/arch/x86/traps.c

index 3e3a61f59bb9c6608502b55270f78058f382aae8..bd4b6f08abb5bb58ce7451bf605661358ce1f9ed 100644 (file)
@@ -753,7 +753,10 @@ int __sync_lazy_execstate(void)
     switch_required = (this_cpu(curr_vcpu) != current);
 
     if ( switch_required )
+    {
+        ASSERT(current == idle_vcpu[smp_processor_id()]);
         __context_switch();
+    }
 
     local_irq_restore(flags);
 
index 53dec24c385901ca3b307b7ba30bb54fc0bdbd7e..590e35921ed329b13afdaf1f0dbb999c1aae0058 100644 (file)
@@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(void)
 {
     ack_APIC_irq();
     perfc_incrc(ipis);
+    irq_enter();
     if ( !__sync_lazy_execstate() )
     {
         if ( flush_va == FLUSHVA_ALL )
@@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(void)
             local_flush_tlb_one(flush_va);
     }
     cpu_clear(smp_processor_id(), flush_cpumask);
+    irq_exit();
 }
 
 void __flush_tlb_mask(cpumask_t mask, unsigned long va)
@@ -335,6 +337,8 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs)
     if ( !cpu_isset(smp_processor_id(), call_data->selected) )
         return;
 
+    irq_enter();
+
     if ( call_data->wait )
     {
         (*func)(info);
@@ -347,4 +351,6 @@ fastcall void smp_call_function_interrupt(struct cpu_user_regs *regs)
         atomic_inc(&call_data->started);
         (*func)(info);
     }
+
+    irq_exit();
 }
index 76aa48d4cb532f35372dda89d78f32dd91dd7e2a..64ab6b69bca3821f27c88b515d209e7ac5424df1 100644 (file)
@@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_user_regs *regs)
     unsigned long addr, fixup;
     int rc;
 
+    ASSERT(!in_irq());
+
     __asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : );
 
     DEBUGGER_trap_entry(TRAP_page_fault, regs);